⚖️ 🌐 🛡️
Atelier de Professionnalisation — Année 2 · BTS SIO SISR
HAProxy — Répartition de charge & Protection contre les attaques DoS
HAProxy · Load Balancing · Round-Robin · Cookies de session · Slowloris · DoS
5
Scénarios réalisés
3
VMs déployées
Cookies de session
DoS
Attaque Slowloris testée
📋
Sujet de l'atelier
TP2 — HAProxy · BTS SIO 2ème année
⬇  Télécharger
📄
Compte-rendu
AP HAProxy — Compte-rendu Adrien Blaize
⬇  Télécharger
Contexte de l'atelier

Cet atelier consiste à mettre en place un serveur de répartition de charge (load balancing) avec HAProxy, le logiciel libre le plus utilisé dans ce domaine. L'objectif est de distribuer intelligemment le trafic HTTP entre plusieurs serveurs web backend, tout en garantissant la cohérence des sessions utilisateurs.

L'infrastructure repose sur trois machines virtuelles : un serveur HAProxy avec deux cartes réseau (réseau public 172.30.206.0/24 et réseau privé 172.20.206.0/24), et deux copies du serveur LAMP (web1 : 172.20.206.81 et web2 : 172.20.206.82) placées sur le réseau privé. Une machine slowloris est également utilisée pour simuler une attaque DoS et en mesurer l'impact.

Mise en place de la répartition de charge
1
Scénario n°1 — Répartition de charge avec pondération (weight)
Load Balancing · Round-Robin

Sans répartition de charge, un seul serveur web absorbe l'intégralité du trafic. Si ce serveur tombe ou sature, le service est interrompu. L'objectif est de distribuer les requêtes entre deux serveurs, en envoyant deux fois plus de charge sur web1 que sur web2.

La section frontend écoute sur l'IP publique 172.30.206.206:80 et redirige vers le backend. La section backend utilise l'algorithme roundrobin avec pondération : weight 2 pour web1 et weight 1 pour web2. La commande option httpchk HEAD / HTTP/1.0 vérifie la disponibilité de chaque serveur avant d'envoyer du trafic.

  • Modifier /etc/haproxy/haproxy.cfg — section frontend : bind 172.30.206.206:80 · default_backend mon_backend
  • Section backend : balance roundrobin · server web1 172.20.206.81:80 weight 2 check · server web2 172.20.206.82:80 weight 1 check
  • Différencier les pages HTML des deux serveurs (fond rouge pour web1, fond bleu pour web2)
  • Tester depuis le navigateur : rechargements successifs → web1 apparaît 2x plus souvent que web2 ✅
✅ Répartition 2:1 validée — web1 reçoit deux fois plus de requêtes
2
Scénario n°2 — Statistiques de répartition en temps réel
Monitoring · Stats

Sans interface de supervision, il est impossible de vérifier en temps réel si la charge est bien répartie, de repérer un serveur saturé ou hors ligne, ou d'analyser le volume de trafic échangé par chaque backend.

Activation de la page de statistiques HAProxy via une section listen stats dans le fichier de configuration. La page est accessible sur le port 8404 à l'adresse 172.30.206.206:8404/stats, protégée par une authentification HTTP Basic (ablai:Sio2025). Un rafraîchissement automatique toutes les 10 secondes permet un monitoring en temps réel.

  • Sessions actives — nombre de connexions en cours par frontend et backend
  • Bytes In/Out — volume de trafic échangé par chaque serveur, pour vérifier la répartition
  • Erreurs et avertissements — surcharge, configuration ou problème réseau détectés instantanément
  • Statut détaillé — état UP/DOWN de chaque serveur backend, durée depuis le dernier check
✅ Page stats opérationnelle — monitoring temps réel sur port 8404
3
Scénario n°3 — États incohérents de session sans cookie
Sessions · Incohérence

Sans mécanisme de persistance de session, le load balancer envoie chaque nouvelle requête vers un serveur différent selon l'algorithme round-robin. Puisque chaque serveur gère ses propres sessions PHP indépendamment, un utilisateur peut se retrouver connecté avec un profil différent selon le backend qui répond à sa requête.

Deux fenêtres de navigateur pointant vers la même URL 172.30.206.206/siteFrais affichent des profils différents : « Cottin Vincenne » sur web1 et « Duduit Frédéric » sur web2. En rechargeant la page, l'identité change selon le serveur qui répond — comportement incohérent inacceptable en production.

  • Aucun cookie de session partagé entre les serveurs
  • Chaque backend attribue une session PHP indépendante à l'utilisateur
  • L'utilisateur change « d'identité » à chaque changement de backend
⚠️ États incohérents prouvés — cookie de session nécessaire
4
Scénario n°4 — Persistance de session par cookie HAProxy
Cookies · Persistance

Pour corriger les états incohérents du scénario 3, il faut garantir qu'un utilisateur reste connecté sur le même serveur backend pour toute la durée de sa session. Sans cette persistance, les applications nécessitant une authentification (comme l'intranet GSB) sont inutilisables en environnement load balancé.

Ajout de la directive cookie SRVNAME insert indirect nocache dans la section backend. HAProxy insère un cookie nommé SRVNAME dans la réponse HTTP avec la valeur web1 ou web2 selon le serveur choisi. Toutes les requêtes suivantes du même client sont ensuite systématiquement routées vers ce serveur.

  • insert — HAProxy insère le cookie dans la réponse envoyée au client
  • indirect — le cookie n'est pas transmis aux serveurs backends (transparent)
  • nocache — empêche les proxies intermédiaires de mettre en cache les réponses contenant ce cookie
  • Validation : le cookie SRVWEB=web1 apparaît dans les outils développeur du navigateur · session constante après rechargement ✅
✅ Persistance de session validée — même profil après rechargement
Simulation d'une attaque Slowloris
5
Scénario n°5 — Impact d'une attaque Slowloris sur le serveur WEB1
DoS · Slowloris · Sécurité

Slowloris est une attaque de type Denial of Service (DoS) particulièrement efficace. Le script ouvre jusqu'à 1000 connexions HTTP simultanées vers la cible, en envoyant des requêtes partielles très lentement et en injectant périodiquement de faux en-têtes HTTP pour maintenir les connexions ouvertes. Le serveur sature ses ressources et ne peut plus répondre aux vraies requêtes. C'est une attaque silencieuse qui consomme peu de bande passante mais provoque un déni de service complet.

  • Lancement de deux instances simultanées du script : ./slowloris.pl -dns 172.20.206.81
  • Message confirmant l'attaque : « Connecting to 172.20.206.81:80 every 100 seconds with 1000 sockets »
  • Commande de surveillance sur web1 : ss -anp | grep 80 | wc -l → résultats affichés : 805, 791, 790, 799… connexions simultanées
  • Nombre de connexions anormalement élevé — serveur saturé, incapable de traiter les requêtes légitimes
  • web1 : couleur rose · statut DOWN · sessions élevées · erreurs et refus visibles
  • web2 : statut UP · sessions faibles · HAProxy bascule automatiquement tout le trafic vers web2
  • Le load balancer absorbe l'attaque et maintient le service accessible via web2 — résilience prouvée
🔴 web1 DOWN sous attaque — web2 UP · service maintenu par HAProxy
Bilan de l'atelier
Scénario Réalisé Résultat clé
Infrastructure — Serveur HAProxy + 2 VMs LAMP ✓ Fait HAProxy 172.30.206.206 · web1 .81 · web2 .82 · réseau privé 172.20.206.0/24
Scénario 1 — Répartition pondérée (weight 2:1) ✓ Fait Round-robin avec weight · web1 reçoit 2× plus de requêtes que web2
Scénario 2 — Page de statistiques HAProxy ✓ Fait Port 8404 · Auth HTTP Basic · Refresh 10s · Sessions, bytes, statuts visibles
Scénario 3 — États incohérents sans cookie ✓ Fait Deux profils différents sur la même URL · cause : sessions PHP indépendantes par backend
Scénario 4 — Persistance par cookie SRVNAME ✓ Fait Cookie SRVWEB=web1 visible · session constante · problème d'incohérence résolu
Scénario 5 — Attaque Slowloris sur web1 ✓ Fait 800+ connexions simultanées · web1 DOWN · HAProxy bascule sur web2 · service maintenu
Outils & technologies utilisés
HAProxy Load Balancing Round-Robin Cookies HTTP Apache2 / LAMP Debian Linux Slowloris (DoS) ss / netstat Proxmox VE phpMyAdmin